#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
struct Node{
    int d,a;
    double v,lft,rgt;
    bool flag;
}node[maxn];
int p[maxn];
int cnt[maxn];
int main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    ios::sync_with_stdio(false);
    int T;
    cin>>T;
    while(T--){
        int n,m;
        double l,vx;
        cin>>n>>m>>l>>vx;
        for(int i=1;i<=n;i++){
            cin>>node[i].d>>node[i].v>>node[i].a;
            if(node[i].a>0&&node[i].v<vx){
                node[i].lft=node[i].d+(vx*vx-node[i].v*node[i].v)/(2.0*node[i].a);
                node[i].rgt=l;
            }
            else if(node[i].a>=0&&node[i].v>vx){
                node[i].lft=node[i].d;
                node[i].rgt=l;
            }
            else if(node[i].a<0&&node[i].v>vx){
                node[i].lft=node[i].d;
                node[i].rgt=min(node[i].d+(vx*vx-node[i].v*node[i].v)/(2.0*node[i].a),l);
            }
            if(node[i].a>=0){
                if(node[i].lft<=l){
                    node[i].flag=true;
                }
            }
            else if(node[i].a<0&&node[i].v>vx){
                node[i].flag=true;
            }
            if(node[i].a>0&&node[i].v<vx){
                if(node[i].lft>node[i].rgt){
                    node[i].flag=false;
                }
            }
        }
        for(int i=1;i<=m;i++){
            cin>>p[i];
        }
        int ans=0;
        int ans2=m;
        for(int i=1;i<=n;i++){
            if(node[i].flag==true&&node[i].a<0){
                int tmp=lower_bound(p+1,p+m+1,node[i].lft)-p;
                if(p[tmp]<node[i].rgt){
                    ans++;
                }
                int t=upper_bound(p+1,p+m+1,node[i].rgt)-p;
                ans2+=t-tmp;
            }
            else if(node[i].flag==true&&node[i].a>=0){
                if(node[i].v>vx){
                    int tmp=lower_bound(p+1,p+m+1,node[i].lft)-p;
                    if(p[tmp]<=node[i].rgt){
                        ans++;
                    }
                    int t=lower_bound(p+1,p+m+1,node[i].rgt)-p;
                    ans2+=t-tmp;
                }
                else{
                    int tmp=upper_bound(p+1,p+m+1,node[i].lft)-p;
                    if(p[tmp]<=node[i].rgt){
                        ans++;
                    }
                    int t=upper_bound(p+1,p+m+1,node[i].rgt)-p;
                    ans2+=t-tmp;
                }
            }
        }
        cout<<ans<<" "<<m-ans2%m<<endl;
    }
    return 0;
}
